package com.xuanzheng.company.dao;

import com.xuanzheng.company.entity.CompanyEmployee;
import java.math.BigDecimal;
import java.util.List;

public interface CompanyEmployeeDao {
    /**
     * 添加入职申请
     * @param companyEmployee 员工申请对象
     * @return 是否添加成功
     */
    boolean addApplication(CompanyEmployee companyEmployee);
    
    /**
     * 更新入职申请状态
     * @param id 申请ID
     * @param status 新状态
     * @param employeeNumber 员工编号（如果通过）
     * @param position 职位（如果通过）
     * @param baseSalary 基础薪资（如果通过）
     * @param rejectReason 拒绝原因（如果拒绝）
     * @return 是否更新成功
     */
    boolean updateApplicationStatus(String id, int status, String employeeNumber, String position, BigDecimal baseSalary, String rejectReason);
    
    /**
     * 根据ID获取入职申请
     * @param id 申请ID
     * @return 员工申请对象
     */
    CompanyEmployee getApplicationById(String id);
    
    /**
     * 根据用户ID获取该用户的所有入职申请
     * @param userId 用户ID
     * @return 员工申请列表
     */
    List<CompanyEmployee> getApplicationsByUserId(String userId);
    
    /**
     * 根据公司ID获取该公司的所有入职申请
     * @param companyId 公司ID
     * @return 员工申请列表
     */
    List<CompanyEmployee> getApplicationsByCompanyId(String companyId);
    
    /**
     * 根据公司ID和状态获取申请列表
     * @param companyId 公司ID
     * @param status 状态
     * @return 员工申请列表
     */
    List<CompanyEmployee> getApplicationsByCompanyIdAndStatus(String companyId, int status);
    
    /**
     * 获取用户最近的一条申请记录
     * @param userId 用户ID
     * @return 员工申请对象
     */
    CompanyEmployee getLatestApplicationByUserId(String userId);
    
    /**
     * 获取用户在特定公司的申请记录
     * @param userId 用户ID
     * @param companyId 公司ID
     * @return 员工申请对象
     */
    CompanyEmployee getApplicationByUserIdAndCompanyId(String userId, String companyId);
    
    /**
     * 获取用户在特定公司的员工记录（已通过的申请）
     * @param userId 用户ID
     * @param companyId 公司ID
     * @return 员工记录对象
     */
    CompanyEmployee getCompanyEmployeeByUserIdAndCompanyId(String userId, String companyId);
    
    /**
     * 检查用户是否已在某公司工作
     * @param userId 用户ID
     * @return 如果已加入公司返回true，否则返回false
     */
    boolean isUserInCompany(String userId);
    
    /**
     * 更新被拒绝的申请状态为待审核，用于重新申请
     * @param id 申请ID
     * @param reason 新的申请理由
     * @return 是否更新成功
     */
    boolean updateApplicationStatusForReapply(String id, String reason);
    
    /**
     * 获取公司所有员工列表（已通过的申请）
     * @param companyId 公司ID
     * @return 员工列表
     */
    List<CompanyEmployee> getEmployeesByCompanyId(String companyId);
    
    /**
     * 根据条件搜索公司员工
     * @param companyId 公司ID
     * @param keyword 搜索关键词（员工ID、姓名、电话、职位）
     * @return 匹配的员工列表
     */
    List<CompanyEmployee> searchEmployees(String companyId, String keyword);
    
    /**
     * 获取员工详细信息
     * @param id 员工申请ID
     * @return 员工详细信息
     */
    CompanyEmployee getEmployeeDetail(String id);
    
    /**
     * 更新员工信息（职位和薪资）
     * @param id 员工申请ID
     * @param position 新职位
     * @param baseSalary 新薪资
     * @return 是否更新成功
     */
    boolean updateEmployeeInfo(String id, String position, BigDecimal baseSalary);
    
    /**
     * 开除员工
     * @param id 员工申请ID
     * @return 是否开除成功
     */
    boolean fireEmployee(String id);
    
    /**
     * 获取公司所有在职员工（状态为1的员工）
     * @param companyId 公司ID
     * @return 在职员工列表
     */
    List<CompanyEmployee> getActiveEmployeesByCompanyId(String companyId);
    
    /**
     * 统计公司员工数量
     * @param companyId 公司ID
     * @return 员工数量
     */
    int countEmployeesByCompanyId(String companyId);

    /**
     * 提交离职申请
     * @param id 员工记录ID
     * @param reason 离职原因
     * @return 是否提交成功
     */
    boolean submitResignation(String id, String reason);
    
    /**
     * 审核离职申请
     * @param id 员工记录ID
     * @param status 新状态(1-拒绝离职(保持在职), 4-批准离职)
     * @return 是否审核成功
     */
    boolean reviewResignation(String id, int status);
    
    /**
     * 根据用户ID获取该用户的离职申请
     * @param userId 用户ID
     * @return 离职申请
     */
    CompanyEmployee getResignationByUserId(String userId);
    
    /**
     * 根据公司ID获取该公司的所有离职申请
     * @param companyId 公司ID
     * @return 离职申请列表
     */
    List<CompanyEmployee> getResignationsByCompanyId(String companyId);
    
    /**
     * 根据员工ID获取用户ID
     * @param id 员工记录ID
     * @return 用户ID
     */
    String getUserIdByEmployeeId(String id);
    
    /**
     * 取消用户所有待处理的申请
     * @param userId 用户ID
     * @return 是否操作成功
     */
    boolean cancelAllPendingApplications(String userId);
} 